﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

using NEH_SA.Model;

namespace NEH_SA.Infrastruktura
{
    public static class Dane
    {
        /// <summary>
        /// Wczytuje dane problemów na podstawie ścieżki pliku.
        /// </summary>
        /// <param name="ścieżkaDoPliku">Ścieżka do pliku z danymi</param>
        /// <returns>Lista problemów</returns>
        public static List<Problem> Wczytaj(string ścieżkaDoPliku)
        {
            var file = new FileInfo(ścieżkaDoPliku);
            if (!file.Exists)
            {
                throw new FileNotFoundException("Podany plik nie istnieje");
            }
            var result = new List<Problem>();
            using (var stream = file.OpenText())
            {
                var problems = stream
                    .ReadToEnd()
                    .Split(new[] { Environment.NewLine + Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                result.AddRange(from problem in problems
                                select problem.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                                    into lines
                                    let nazwa = lines.First().Trim()
                                    let liczby = lines[1].Split().Select(int.Parse).ToList()
                                    let liczbaMaszyn = liczby.Last()
                                    let liczbaZadań = liczby.First()
                                    let zadania = lines.Skip(2)
                                                       .Select(line => line.Split()
                                                                           .Where(s => s != "")
                                                                           .Where((s, i) => i % 2 != 0)
                                                                           .Select(int.Parse).ToList())
                                                       .Select(czasy => new Zadanie(czasy))
                                                       .ToList()
                                    select new Problem(zadania, liczbaZadań, liczbaMaszyn, nazwa));
            }
            return result;
        }

        /// <summary>
        /// Zapisuje rozwiązanie do pliku txt.
        /// </summary>
        /// <param name="rozwiązania">Lista rozwiązań</param>
        /// <param name="filePath">Ścieżka do pliku</param>
        public static void Zapisz(List<Rozwiązanie> rozwiązania, string filePath)
        {
            var file = new FileInfo(filePath);
            var header = string.Format("{0,-8}{1,-10}{2,-8}{3,-16}", "Nazwa", "Algorytm", "CMax", "Permutacja");
            const string data = "{0,-8}{1,-10}{2,-8}";
            using (var stream = file.CreateText())
            {
                stream.WriteLine(header);
                for (int i = 0; i < rozwiązania.Count; i++)
                {
                    if (i % 10 == 0) { stream.WriteLine(); }
                    var rozwiązanie = rozwiązania[i];
                    stream.Write(data, rozwiązanie.NazwaProblemu, rozwiązanie.TypRozwiązania, rozwiązanie.CMax);
                    foreach (var numerMaszyny in rozwiązanie.Permutacja)
                    {
                        stream.Write("{0,4}", numerMaszyny + 1);
                    }
                    stream.WriteLine();
                }
            }
        }
    }
}
